package cn.lzm.registry;

import cn.hutool.core.exceptions.ExceptionUtil;
import cn.lzm.utils.SpiLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author lzm
 * @Date 2024/8/11
 * @description 这里使用了SPI来加载注册中心的配置
 */
public class RegistryFactory {

    private static final Logger log = LoggerFactory.getLogger(RegistryFactory.class);

    static {
        // 根据SPI中的配置类初始化一个实例
        SpiLoader.load(Registry.class);
    }

    /**
     * 默认的注册中心
     */
    private static final Registry DEFAULT_REGISTRY = new EtcdRegistry();

    /**
     * 获取注册中心的实例
     *
     * @param key 注册中心的类型，也是SPI的key
     * @return 注册中心实例
     */
    public static Registry getInstance(String key) {
        try {
            return SpiLoader.getInstance(Registry.class, key);
        } catch (Exception e) {
            log.error("获取注册中心实例的过程中发生了异常：{}，key={}", ExceptionUtil.getThrowableList(e), key);
            return DEFAULT_REGISTRY;
        }
    }

}
